package helper

// NewPipeline 方法用于创建 Pipeline 实例
func NewPipeline[T any]() *Pipeline[T] {
	return &Pipeline[T]{}
}

// Pipeline 结构体
type Pipeline[T any] struct {
	payload T
	stages  []func(T) (T, error)
}

// Send 方法用于设置初始数据
func (p *Pipeline[T]) Send(data T) *Pipeline[T] {
	p.payload = data
	return p
}

// Through 方法用于添加处理阶段，处理阶段函数返回 T 和 error
func (p *Pipeline[T]) Through(stages ...func(T) (T, error)) *Pipeline[T] {
	p.stages = append(p.stages, stages...)
	return p
}

// Then 方法用于执行所有处理阶段
func (p *Pipeline[T]) Then(f func(T) (T, error)) (T, error) {
	var result = p.payload
	for _, stage := range p.stages {
		var err error
		result, err = stage(result)
		if err != nil {
			return *new(T), err
		}
	}
	return f(result)
}
